package com.example.linearlayoutdemo.startservice;

import android.Manifest;
import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class GpsCsvService extends Service {
    private static final String TAG = "GpsCsvService";
    private LocationManager locationManager;
    private File csvFile;
    private BufferedWriter csvWriter;
    private boolean isSaving = false; // 标记是否正在保存数据

    @Override
    public void onCreate() {
        super.onCreate();
        // 1. 初始化 CSV 文件（保存到外部存储）
        initCsvFile();
        // 2. 初始化 GPS 监听器
        initGpsListener();
    }

    // 处理启动指令（如“开始保存”“停止保存”）
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent == null) return START_STICKY;

        String command = intent.getStringExtra("COMMAND");
        if ("START_SAVE".equals(command) && !isSaving) {
            // 开始保存：启用 GPS 监听
            startGpsListening();
            isSaving = true;
            Log.d(TAG, "开始保存 GPS 数据到 CSV");
        } else if ("STOP_SAVE".equals(command) && isSaving) {
            // 停止保存：关闭 GPS 监听 + 关闭 CSV 流
            stopGpsListening();
            closeCsvWriter();
            isSaving = false;
            Log.d(TAG, "停止保存 GPS 数据");
            // 停止 Service（任务完成）
            stopSelf(startId);
        }

        // START_STICKY：Service 被系统杀死后，若有未完成任务，系统会尝试重启
        return START_STICKY;
    }

    // 初始化 CSV 文件（保存路径：外部存储/Documents/GpsData.csv）
    private void initCsvFile() {
        try {
            // Android 10+ 推荐用作用域存储，此处简化用外部存储
            File externalDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
            csvFile = new File(externalDir, "GpsData.csv");

            // 若文件不存在，创建并写入表头（纬度,经度,时间戳）
            if (!csvFile.exists()) {
                csvFile.createNewFile();
                csvWriter = new BufferedWriter(new FileWriter(csvFile, true));
                csvWriter.write("Latitude,Longitude,Timestamp");
                csvWriter.newLine();
            } else {
                // 若文件已存在，追加写入（不覆盖表头）
                csvWriter = new BufferedWriter(new FileWriter(csvFile, true));
            }
        } catch (IOException e) {
            Log.e(TAG, "初始化 CSV 文件失败：" + e.getMessage());
        }
    }

    // 初始化 GPS 监听器
    private void initGpsListener() {
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        // 检查 GPS 是否可用
        if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Log.e(TAG, "GPS 未开启，请在设置中启用");
            stopSelf(); // GPS 不可用，停止 Service
        }
    }

    // 开始监听 GPS 数据
    private void startGpsListening() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, "缺少 GPS 定位权限");
            return;
        }

        // 注册 GPS 监听：每 1 秒、每移动 0 米更新一次（可根据需求调整）
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER,
                1000, // 最短更新间隔（毫秒）
                0,    // 最短更新距离（米）
                new LocationListener() {
                    @Override
                    public void onLocationChanged(Location location) {
                        // GPS 数据更新：写入 CSV
                        writeGpsToCsv(location);
                    }

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {}

                    @Override
                    public void onProviderEnabled(String provider) {}

                    @Override
                    public void onProviderDisabled(String provider) {}
                }
        );
    }

    // 将 GPS 数据写入 CSV 文件
    private void writeGpsToCsv(Location location) {
        if (csvWriter == null || !isSaving) return;

        try {
            // 拼接数据：纬度,经度,时间戳（时间戳转成可读格式）
            String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
                    .format(new Date(location.getTime()));
            String csvLine = String.format("%.6f,%.6f,%s",
                    location.getLatitude(),
                    location.getLongitude(),
                    time);

            // 写入 CSV 并刷新（避免数据缓存丢失）
            csvWriter.write(csvLine);
            csvWriter.newLine();
            csvWriter.flush();
            Log.d(TAG, "写入 GPS 数据：" + csvLine);
        } catch (IOException e) {
            Log.e(TAG, "写入 CSV 失败：" + e.getMessage());
        }
    }

    // 停止 GPS 监听
    private void stopGpsListening() {
        if (locationManager != null) {
            locationManager.removeUpdates(new LocationListener() {
                @Override public void onLocationChanged(Location location) {}
                @Override public void onStatusChanged(String provider, int status, Bundle extras) {}
                @Override public void onProviderEnabled(String provider) {}
                @Override public void onProviderDisabled(String provider) {}
            });
        }
    }

    // 关闭 CSV 写入流
    private void closeCsvWriter() {
        if (csvWriter != null) {
            try {
                csvWriter.close();
            } catch (IOException e) {
                Log.e(TAG, "关闭 CSV 流失败：" + e.getMessage());
            }
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        // 纯启动 Service，无需绑定，返回 null
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 销毁时清理资源：停止监听 + 关闭流
        stopGpsListening();
        closeCsvWriter();
        Log.d(TAG, "Service 销毁，资源已清理");
    }
}
